package org.microframework.base.core.security.model;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * 登录用户信息
 */
public class LoginUser implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 用户名
     */
    private String username;
    
    /**
     * 用户真实姓名
     */
    private String realName;
    
    /**
     * 登录时间戳
     */
    private Long loginTime;
    
    /**
     * 过期时间戳
     */
    private Long expireTime;
    
    /**
     * 登录IP地址
     */
    private String ipaddr;
    
    /**
     * 浏览器类型
     */
    private String browser;
    
    /**
     * 操作系统
     */
    private String os;
    
    /**
     * 权限列表
     */
    private Set<String> permissions;
    
    /**
     * 角色列表
     */
    private Set<String> roles;
    
    /**
     * 是否为管理员
     */
    private boolean admin = false;
    
    /**
     * 创建登录用户
     */
    public LoginUser() {
        this.permissions = new HashSet<>();
        this.roles = new HashSet<>();
    }
    
    /**
     * 创建登录用户
     * 
     * @param userId 用户ID
     * @param username 用户名
     */
    public LoginUser(Long userId, String username) {
        this.userId = userId;
        this.username = username;
        this.permissions = new HashSet<>();
        this.roles = new HashSet<>();
    }
    
    /**
     * 创建登录用户
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param permissions 权限列表
     */
    public LoginUser(Long userId, String username, Set<String> permissions) {
        this.userId = userId;
        this.username = username;
        this.permissions = permissions;
        this.roles = new HashSet<>();
    }
    
    /**
     * 获取用户ID
     * 
     * @return 用户ID
     */
    public Long getUserId() {
        return userId;
    }
    
    /**
     * 设置用户ID
     * 
     * @param userId 用户ID
     */
    public void setUserId(Long userId) {
        this.userId = userId;
    }
    
    /**
     * 获取用户名
     * 
     * @return 用户名
     */
    public String getUsername() {
        return username;
    }
    
    /**
     * 设置用户名
     * 
     * @param username 用户名
     */
    public void setUsername(String username) {
        this.username = username;
    }
    
    /**
     * 获取用户真实姓名
     * 
     * @return 用户真实姓名
     */
    public String getRealName() {
        return realName;
    }
    
    /**
     * 设置用户真实姓名
     * 
     * @param realName 用户真实姓名
     */
    public void setRealName(String realName) {
        this.realName = realName;
    }
    
    /**
     * 获取登录时间戳
     * 
     * @return 登录时间戳
     */
    public Long getLoginTime() {
        return loginTime;
    }
    
    /**
     * 设置登录时间戳
     * 
     * @param loginTime 登录时间戳
     */
    public void setLoginTime(Long loginTime) {
        this.loginTime = loginTime;
    }
    
    /**
     * 获取过期时间戳
     * 
     * @return 过期时间戳
     */
    public Long getExpireTime() {
        return expireTime;
    }
    
    /**
     * 设置过期时间戳
     * 
     * @param expireTime 过期时间戳
     */
    public void setExpireTime(Long expireTime) {
        this.expireTime = expireTime;
    }
    
    /**
     * 获取登录IP地址
     * 
     * @return 登录IP地址
     */
    public String getIpaddr() {
        return ipaddr;
    }
    
    /**
     * 设置登录IP地址
     * 
     * @param ipaddr 登录IP地址
     */
    public void setIpaddr(String ipaddr) {
        this.ipaddr = ipaddr;
    }
    
    /**
     * 获取浏览器类型
     * 
     * @return 浏览器类型
     */
    public String getBrowser() {
        return browser;
    }
    
    /**
     * 设置浏览器类型
     * 
     * @param browser 浏览器类型
     */
    public void setBrowser(String browser) {
        this.browser = browser;
    }
    
    /**
     * 获取操作系统
     * 
     * @return 操作系统
     */
    public String getOs() {
        return os;
    }
    
    /**
     * 设置操作系统
     * 
     * @param os 操作系统
     */
    public void setOs(String os) {
        this.os = os;
    }
    
    /**
     * 获取权限列表
     * 
     * @return 权限列表
     */
    public Set<String> getPermissions() {
        return permissions;
    }
    
    /**
     * 设置权限列表
     * 
     * @param permissions 权限列表
     */
    public void setPermissions(Set<String> permissions) {
        this.permissions = permissions;
    }
    
    /**
     * 添加权限
     * 
     * @param permission 权限
     */
    public void addPermission(String permission) {
        if (this.permissions == null) {
            this.permissions = new HashSet<>();
        }
        this.permissions.add(permission);
    }
    
    /**
     * 添加权限集合
     * 
     * @param permissions 权限集合
     */
    public void addPermissions(Collection<String> permissions) {
        if (this.permissions == null) {
            this.permissions = new HashSet<>();
        }
        this.permissions.addAll(permissions);
    }
    
    /**
     * 获取角色列表
     * 
     * @return 角色列表
     */
    public Set<String> getRoles() {
        return roles;
    }
    
    /**
     * 设置角色列表
     * 
     * @param roles 角色列表
     */
    public void setRoles(Set<String> roles) {
        this.roles = roles;
    }
    
    /**
     * 添加角色
     * 
     * @param role 角色
     */
    public void addRole(String role) {
        if (this.roles == null) {
            this.roles = new HashSet<>();
        }
        this.roles.add(role);
    }
    
    /**
     * 添加角色集合
     * 
     * @param roles 角色集合
     */
    public void addRoles(Collection<String> roles) {
        if (this.roles == null) {
            this.roles = new HashSet<>();
        }
        this.roles.addAll(roles);
    }
    
    /**
     * 是否为管理员
     * 
     * @return 是否为管理员
     */
    public boolean isAdmin() {
        return admin;
    }
    
    /**
     * 设置是否为管理员
     * 
     * @param admin 是否为管理员
     */
    public void setAdmin(boolean admin) {
        this.admin = admin;
    }
} 